对于 Vue 响应式的疑惑:Vue 为什么不能检测到对象属性的添加或删除?为什么不支持通过索引设置数组成员?
Vue官方响应式原理:
避坑指南
对象
1 | <div id="app"> |
解决办法一:调用Vue的静态方法set
1 | Vue.set(targetObj,prop,value) |
解决办法二:调用实例上的方法
1 | vm.$set(vm.student, 'kitty', '456') |
解决办法三:改写预定义属性的值,重新赋值
1 | vm.student = { |
数组
1 | let vm = new Vue({ |
解决办法:提供了观察数组的变异方法,使用这些方法会触发视图更新,
push(),pop()|shift(),unshift()|splice,sort()
1 | // 通过splice修改数组 |
Vue响应式原理
上面的做法虽然避坑,但是…为什么呢?找原因就要思考一下Vue如何实现的响应式。
Vue 的数据劫持依赖于 Object.defineProperty,所以一定是因为它的某些特性,才引起这个问题。
🌰 举个栗子:
1 | // 定义cb函数,模拟视图更新操作,调用它即表示更新视图 |